﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using CP.Entities;

namespace CP.DataAccess
{
    public class ProductoDAO: MasterDAL, IProductoDAO
    {
        ICategoriaDAO factoryCatDAO;
        List<Categoria> listaCategorias;

        public ProductoDAO()
        {
            factoryCatDAO = new CategoriaDAO();
        }

        public List<Producto> GetAllFromProducto()
        {
            SqlCommand command = base.CreateCommand("GetAllFromProducto");

            return SelectObjectFactory(command);
        }

        public Producto GetFromProductoByCodigo(string codigo)
        {
            SqlCommand command = base.CreateCommand("GetFromProductoByCodigo");

            base.AddInParameter(command, "codigo", codigo);

            return SelectObjectFactory(command).SingleOrDefault();
        }

        public List<Producto> GetFromProductoByCriterio(string criterio)
        {
            throw new NotImplementedException();
        }

        public void RegistrarProducto(Producto producto)
        {
            SqlCommand command = base.CreateCommand("RegistrarProducto");

            base.AddInParameter(command, "id ", producto.Id);
            base.AddInParameter(command, "categoriaId", producto.CategoriaId);
            base.AddInParameter(command, "codigo", producto.Codigo);
            base.AddInParameter(command, "descripcion", producto.Descripcion);
            base.AddInParameter(command, "precio", producto.Precio);
            base.AddInParameter(command, "stock", producto.Stock);

            base.ExecuteNonQuery(command);
        }

        public void EliminarProducto(int producto)
        {
            SqlCommand command = base.CreateCommand("DeleteProducto");

            base.AddInParameter(command, "id", producto);

            base.ExecuteNonQuery(command);
        }

        private List<Producto> SelectObjectFactory(SqlCommand command)
        {
            List<Producto> lista = new List<Producto>();
            listaCategorias = factoryCatDAO.GetAllFromCategoria();

            using (SqlDataReader reader = base.ExecuteReader(command))
            {
                while (reader.Read())
                {
                    Producto producto = new Producto()
                    {
                        Id = reader.GetInt32(0),
                        CategoriaId = reader.GetInt32(1),
                        Codigo = reader.GetString(2),
                        Descripcion = reader.GetString(3),
                        Precio = reader.GetDecimal(4),
                        Stock = reader.GetDecimal(5),
                        Categoria = GetCategoria(reader.GetInt32(1))
                    };

                    lista.Add(producto);
                }

                return lista;
            }
        }

        private Categoria GetCategoria(Int32 id)
        {
            var query = from c in listaCategorias
                        where c.Id == id
                        select c;

            return query.SingleOrDefault();
        }

        public Producto GetFromProductoById(int id)
        {
            SqlCommand command = base.CreateCommand("GetFromProductoById");

            base.AddInParameter(command, "id", id);

            return SelectObjectFactory(command).SingleOrDefault(); 
        }
    }
}
